package com.example.project8

import android.os.Bundle
import android.util.Log
import android.widget.*
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import com.example.project8.weather.Forecast
import com.example.project8.weather.Weather

import com.google.gson.Gson
import com.google.gson.reflect.TypeToken

class MainActivity2 : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 启用 Edge-to-Edge 模式，让内容可以延伸到屏幕边缘（适配全面屏设备）
        enableEdgeToEdge()
        // 设置布局文件为 activity_main2.xml
        setContentView(R.layout.activity_main)
        // 处理系统栏（状态栏/导航栏）与内容的边距，避免UI被遮挡
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
        // 基础天气 API 地址，后面拼接城市编码即可请求对应城市天气
        val baseURL = "http://t.weather.itboy.net/api/weather/city/"

        // 从上一个 Activity（MainActivity）通过 Intent 传递过来的城市编码
        val city = intent.getStringExtra("city")

        // 创建 Volley 请求队列，用于发起网络请求
        val queue = Volley.newRequestQueue(this)

        // 创建一个 StringRequest，用于 GET 请求天气数据
        val stringRequest = StringRequest(baseURL + city, { response ->

            // 请求成功，response 是返回的 JSON 字符串

            // 创建 Gson 实例，用于解析 JSON
            val gson = Gson()

            // 定义泛型类型：我们要解析的 JSON 结构对应 Weather 类
            val weatherType = object : TypeToken<Weather>() {}.type

            // 将 JSON 字符串解析成 Weather 对象
            val weather = gson.fromJson<Weather>(response, weatherType)

            // 更新界面上的各个控件，展示天气信息

            // 城市名称（来自 cityInfo.city）
            findViewById<TextView>(R.id.textView_city).text = weather.cityInfo.city

            // 省份或上级地区（来自 cityInfo.parent）
            findViewById<TextView>(R.id.textview_province).text = weather.cityInfo.parent

            // 当前温度（来自 data.wendu，单位：摄氏度）
            findViewById<TextView>(R.id.textView_wendu).text = weather.data.wendu

            // 当前湿度等信息（来自 data.shidu）
            findViewById<TextView>(R.id.textView_shidu).text = weather.data.shidu

            // 根据第一天的天气状况，设置对应的天气图标
            val forecastFirstDay = weather.data.forecast.first()  // 获取第一天的预报
            val weatherTypeToday = forecastFirstDay.type             // 比如 "晴", "多云", "小雨"
            val imageView = findViewById<ImageView>(R.id.imageView)

            imageView.setImageResource(when (weatherTypeToday) {
                "阴"     -> R.drawable.cloud      // 阴天图标
                "多云"   -> R.drawable.mcloud    // 多云图标
                "小雨"   -> R.drawable.rain      // 小雨图标
                "小雪"   -> R.drawable.snow      // 小雪图标
                "雷阵雨" -> R.drawable.thunder   // 雷阵雨图标
                else     -> R.drawable.sun       // 默认显示太阳（比如晴天或其他未匹配情况）
            })

            // 获取未来几天的天气预报列表（data.forecast 是 List<Forecast> 类型）
            val forecastList = weather.data.forecast

            // 创建一个 ArrayAdapter，用于在 ListView 中展示预报信息
            // 注意：这里直接使用了 Forecast 对象，会调用其 toString() 方法显示在列表中
            // 如果希望自定义显示内容，建议重写 Forecast 的 toString() 或使用自定义 Adapter
            val adapter = ArrayAdapter<Forecast>(
                this,                         // 上下文
                android.R.layout.simple_list_item_1,  // 系统提供的单行文本布局
                forecastList                  // 数据源：forecast 列表
            )

            // 获取界面上的 ListView 控件，并设置适配器
            findViewById<ListView>(R.id.listView).adapter = adapter

            // 打印返回的原始 JSON 数据
            Log.d("MainActivity2", response)

        }, { error ->

            // 请求失败，打印错误信息
            Log.d("MainActivity2", "请求失败: $error")

        })

        // 将请求添加到 Volley 请求队列中，开始发起网络请求
        queue.add(stringRequest)
    }
}